package com.zjs.vuegoodstype.service.impl;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zjs.vuegoodstype.entity.GoodsTypeQuery;
import com.zjs.vuegoodstype.entity.VueGoodstype;
import com.zjs.vuegoodstype.mapper.GoodstypeMapper;
import com.zjs.vuegoodstype.service.GoodstypeService;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author zjs
 * @since 2022-01-23
 */
@Service
public class GoodstypeServiceImpl extends ServiceImpl<GoodstypeMapper, VueGoodstype> implements GoodstypeService {


    @Override
    public IPage<VueGoodstype> getGoodsTypeList(GoodsTypeQuery query) {

        return baseMapper.selectPage(new Page<>(query.getCurrent(), query.getSize()),
                new QueryWrapper<VueGoodstype>().lambda()
                        .like(StrUtil.isNotBlank(query.getTypeName()),
                                VueGoodstype::getTypeName, query.getTypeName()));
    }

    @Override
    public IPage<VueGoodstype> getTypeList(GoodsTypeQuery query) {
        IPage<VueGoodstype> page = new Page<>(query.getCurrent(), query.getSize());
        //查出一级分类
        IPage<VueGoodstype> iPage = baseMapper.selectPage(page, new QueryWrapper<VueGoodstype>().lambda().eq(VueGoodstype::getPid, 0)
                .like(StrUtil.isNotBlank(query.getTypeName()), VueGoodstype::getTypeName, query.getTypeName()));

        List<VueGoodstype> records = iPage.getRecords();
        //查出二三级分类
        List<VueGoodstype> list = baseMapper.selectList(
                new QueryWrapper<VueGoodstype>().lambda().notIn(VueGoodstype::getPid,0));
        //分组
        List<VueGoodstype> target = list.stream().filter(item -> "2".equals(item.getTypeSort()))
                .peek(item -> item.setItems(getGroup(item, list))).collect(Collectors.toList());

        List<VueGoodstype> mainList = records.stream().peek(item -> item.setItems(getGroup(item, target))).collect(Collectors.toList());
        page.setRecords(mainList);

        return page;
    }

    @Override
    public List<VueGoodstype> getSelectList() {
        List<VueGoodstype> list = baseMapper.selectList(new QueryWrapper<VueGoodstype>().lambda()
                .in(VueGoodstype::getTypeSort, "2", "1"));

        List<VueGoodstype> collect = list.stream().filter(item -> "2".equals(item.getTypeSort()))
                .peek(item -> item.setItems(null)).collect(Collectors.toList());

        List<VueGoodstype> mainList = list.stream().filter(item -> item.getPid() == 0)
                .peek(item -> item.setItems(getGroup(item, collect)))
                //不为null前端级联组件会展示为没有数据
                .peek(item -> {if(item.getItems().size() == 0){ item.setItems(null);}})
                .collect(Collectors.toList());
        return mainList;
    }

    public List<VueGoodstype> getGroup(VueGoodstype source, List<VueGoodstype> target) {
        return target.stream().filter(item -> item.getPid().equals(source.getId()))
                .collect(Collectors.toList());
    }
}
